#include "logic.h"
#include <QMessageBox>
#include "connectiondialog.h"
#include <QCryptographicHash>
#include <QHash>


#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/hdreg.h>
#include <QMessageBox>
#include <sys/ioctl.h>
#include <QFile>



//#define PASS_SALT "Ddo2'.d';dLJ}dD<d,:VLs,/<DVlsd,v";

//static QHash<int,QString> hashPermissions;
//hashPermissions.insert(7, QString("Аудитор"));


static QString _host;
static QString _dbName;
static QString _userName;
static QString _localUserName;
static int _permissions;

bool logic::openDB(QString host, QString dbName, QString userName, QString passwd)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    if (!db.isValid())
        qDebug() << "Invalid database driver";
    db.setHostName(host);
    db.setDatabaseName(dbName);
    if (!db.open(userName, passwd)) {
        passwd = "";
        //qCritical() << QObject::tr("Ошибка открытия базы данных: ") << db.lastError();
        QMessageBox::warning(0, "Ошибка при подключении к базе данных!",
                             "Ошибка при подключении к База Данных. Проверьте корректность введённых в форму данных!\n"
                             + db.lastError().text(),
                             QMessageBox::Ok, QMessageBox::Ok);
        return 0;
    }
    else {
        passwd = "";
        qDebug() << QObject::tr("База данных успешно открыта...");
        _userName = userName;
        return 1;
    }
}

bool logic::changeActiveUser(const QString userName, QString passwd)
{
    if (_userName == userName){
        QMessageBox::information(0, "Не пытайтесь меня обмануть!",
                                 "Вы и так сейчас под этим пользователем!",
                                 QMessageBox::Ok, QMessageBox::Ok);
        return 0;
    }
    QSqlDatabase::removeDatabase(QSqlDatabase::database().connectionName());
    QSqlDatabase db = QSqlDatabase::addDatabase("MYSQL");
    if (!db.open(userName, passwd)) {
        passwd="";
        QMessageBox msgBox;
        msgBox.setText(QObject::tr("Ошибка при авторизации пользователя!"));
        msgBox.setInformativeText(QObject::tr("Ошибка при авторизации пользователя! Проверьте корректность введённых данных и доступность сервера!"));
        msgBox.setStandardButtons(QMessageBox::Ok);
        msgBox.setDefaultButton(QMessageBox::Ok);
        msgBox.exec();
        return 0;
    }
    else {
        passwd = "";
        _userName = userName;
        qDebug() << QObject::tr("База данных успешно открыта(смена пользователя) под %1...").arg(userName);
        return 1;
    }
}


bool logic::deleteRowSingleDict(const QString &sqlTable, int rowId)
{
    QSqlQuery query;
    if(!query.exec(QString("DELETE FROM %1 WHERE id=%2")
        .arg(sqlTable)
        .arg(rowId)))
    {
        QMessageBox::warning(0,"Невозможно удалить элемент!",
                             "Невозможно удалить элемент по причине:" +query.lastError().text(),
                             QMessageBox::Ok, QMessageBox::Ok);
        return false;
    }
    return true;
}

QString logic::hashPasswd(const QString &passwd)
{
    QByteArray pass;
    pass.append("Ddo2'.d';dLJ}dD<d,:VLs,/<DVlsd,v");
    pass.append(passwd);
    return QCryptographicHash::hash(pass, QCryptographicHash::Sha1);
}




int logic::permissions()
{
    return _permissions;
}


bool logic::changeActiveLocalUser(const QString userName, QString passwd)
{
    if (_localUserName == userName){
        QMessageBox::information(0, "Не пытайтесь меня обмануть!",
                                 "Вы и так сейчас под этим пользователем!",
                                 QMessageBox::Ok, QMessageBox::Ok);
        return 0;
    }
    QSqlQuery query;
    query.prepare(QString("SELECT permission FROM users WHERE name = \"%1\" AND passwd = \"%2\"")
                  .arg(userName)
                  .arg((logic::hashPasswd(passwd)).replace("'","\\\'")));
    if(!query.exec()){
        qCritical() << "SQL execute error: " << query.lastError().text();
    }
    if(query.next()) {
        _permissions = query.value(0).toInt();
        _localUserName = userName;
        return true;
    }
    return false;
}


QString logic::hdSerial()
{
    struct hd_driveid hd;
    int fd = open("/dev/hda", O_RDONLY|O_NONBLOCK);
    if (fd < 0)
    {
        perror("/dev/hda");
    }
    if(!ioctl(fd, HDIO_GET_IDENTITY, &hd))
    {
        QString s1((char *)hd.serial_no);
        //printf("Serial Number=%s\n",hd.serial_no);
        //printf("Model Number=%s\n",id.model);
        if (!s1.isEmpty()){
            qDebug() << "match";
            return s1;
        }else {
            qDebug() << "no match";
        }
    }
    return "";
}

QStringList logic::getSreets()
{
    QSqlQuery query;
    QStringList list;
    query.prepare("SELECT `name` FROM `streets`");
    if (!query.exec()) {
        qCritical() << "SQL execute error: " << query.lastError().text();
    }    
    else {
        while (query.next()){
            list << query.value(0).toString();
        }
    }
    return list;
}

QStringList logic::getDistricts()
{
    QSqlQuery query;
    QStringList list;
    query.prepare("SELECT `name` FROM `distrofcity`");
    if (!query.exec()){
        qCritical() << "SQL execute error: " << query.lastError().text();
    }
    else {
        while (query.next()){
            list << query.value(0).toString();
        }
    }
    return list;
}

QStringList logic::getRoads()
{
    QSqlQuery query;
    QStringList list;
    query.prepare("SELECT `name` FROM `roads`");
    if (!query.exec()){
        qCritical() << "SQL execute error: " << query.lastError().text();
    }
    else {
        while (query.next()) {
            list  << query.value(0).toString();
        }
    }
    return list;
}

QStringList logic::getTypesTr()
{
    QSqlQuery query;
    QStringList list;
    query.prepare("SELECT `name` FROM `typestr`");
    if (!query.exec()) {
        qCritical() << "SQL execute error: " << query.lastError().text();
    }
    else {
        while (query.next()) {
            list << query.value(0).toString();
        }
    }
    return list;
}

QStringList logic::getTypesDTP()
{
    QSqlQuery query;
    QStringList list;
    query.prepare("SELECT `name` FROM `typesdtp`");
    if (!query.exec()) {
        qCritical() << "SQL execute error: " << query.lastError().text();
    }
    else {
        while (query.next()) {
            list << query.value(0).toString();
        }
        }
    return list;
}

QStringList logic::getLocations()
{
    QStringList list;
    list << "Ставрополь" << "Шпаковский район";
    return list;
}
















